This script examines the discharge in Neversink Cr.
This script uses the USGS data retrieval package to download data fro Neversink Cr. This is more up to date than the excel sheet.
Install libraries.
These are the libraries that are used in the script. These are installed only once and then can be commented out so they do not run in future execuations of the script.
# https://github.com/USGS-R/dataRetrieval
# general R packages to install if you dont have them
# remove the "#" if you need to run the installations
# install.packages("devtools") # essential in installing other thigs
# install.packages("tidyverse") # installs a lot of things and ggplot
# install.packages("scales") # allows great scale formatting on ggplot
# install.packages("lubridate") # makes working with dates easier
# install.packages("janitor") # clean names of columns and other things
# install.packages("readxl") # read in excel files
# install.packages("plotly") # interactive plots
# install.packages("skimr")
# install.packages("patchwork") # multiple plots
# specific to this module
# install.packages("dataRetrieval") # USGS Data Retreiveal Method
Load Libraries
This code loads the libraries for working with the data
# load these every time
library(tidyverse) # the tidyverse library with many sub libraries
library(scales) # working with ggplot scales
library(lubridate) # working with dates
library(janitor) # cleans up excel imports
library(readxl) # read in excel files
library(skimr) # does summary stats and other things
library(plotly) # makes interactive plots
library(patchwork) # combines many plots together
# # load the USGS package
library(dataRetrieval) # utilities for downloading and working with USGS data
Read in USGS Data
This allows you to read in the daily mean data for the USGS site.
Note Enter the following information and you can change this to get different sites or time ranges:
site_no: this is the site that you want to import
par_code: these are the paramter code numbers - 00060 is discharge
You can retreive other variables using:
c(“00060”, “00065”)
00010 water temp
00060 discharge
00065 gage height
00095 specific conductivity if available
start.date: date to start on
end.date: date to end on
# The site is Neversink and the site number is 01435000
# USGS 01435000 NEVERSINK RIVER NEAR CLARYVILLE NY
# enter these variables
site_no <- "01435000"
par_code <- "00060"
start.date <- "1800-01-01"
end.date <- "2050-01-01"
neversink_daily.df <- readNWISdv(siteNumbers = site_no,
parameterCd = par_code,
startDate = start.date,
endDate = end.date)
# rename the columns
neversink_daily.df <- renameNWISColumns(neversink_daily.df)
Rename columns
This just renames the columns to lower case and variable names with units
neversink_daily.df <- neversink_daily.df %>%
select(agency_cd,
site_no,
date = Date,
discharge_cfs = Flow)
Create a month variable
The module would like to look at flows during differnet months. This creates a month column that can then be used to filter out and plot only the respective months.
neversink_daily.df <- neversink_daily.df %>%
mutate(month = month(date))
Plot all discharge data
This is a plot of all of the data that is on the USGS website for daily mean values.
# saves the plot as q.plot so can be used later on
q.plot <- neversink_daily.df %>% # use this dataframe
ggplot(aes(date, discharge_cfs)) + # plot discharge_cfs versus date
geom_point(size=0.1) + # add points that are small
geom_line() # add a line on top of points
q.plot # call the plot to display

Plot February data
This creates a plot of just February data. It can do this using pipes rather than creating subdataframes which is a key advantage of tidyverse.
# saves as the feb.plot using the neversink_daily.df data
feb.plot <- neversink_daily.df %>%
filter(month == 2) %>% # this filters out only February
ggplot(aes(date, discharge_cfs)) + # this plots discharge versus date
geom_point(size = 0.1) + # adds small points
geom_line() + # adds a line
labs(y="Mean Monthly Discharge m^3/sec", x="Date") # adds clean axes labels
feb.plot

NA
Interactive plot of feb data
This is an interactive plot of the february data. You can zoom in and out and select particular pints to see the values.
ggplotly(feb.plot)
August data
Plot of August data only using eh above formate. The only thing to change is the value for the month variable. This could be improved by showing the monthly mean of data in the same format below adding a a stat_summary command to show monthly mean as well.
aug.plot <- neversink_daily.df %>%
filter(month == 8) %>%
ggplot(aes(date, discharge_cfs)) +
geom_point() +
geom_line() +
labs(y="Mean Monthly Discharge m^3/sec", x="Date")
aug.plot

Compare the February and August plots
We can use patchwork to put both plots on the same page to compare them
feb_aug.plot <- feb.plot +
aug.plot +
plot_layout(ncol = 2)
feb_aug.plot

Add trend lines of discharge over time
Because the data is over such a wide range I have zoomed in. There are two ways to zoom - the scale_x_continuous(limits = c(0,300)) will delete data that is not in this range. The coord_cartesian(ylim=c(0,300)) will zoom in without deleting data.
feb_aug.plot <- feb.plot +
geom_smooth(method="lm") +
coord_cartesian(ylim = c(0,300)) +
aug.plot + geom_smooth(method="lm") +
coord_cartesian(ylim = c(0,300)) +
plot_layout(ncol = 2)
feb_aug.plot

Regression statistics of February data
feb.model <- neversink_daily.df %>%
filter(month == 2) %>%
lm(discharge_cfs ~ date, data=.)
summary(feb.model)
Call:
lm(formula = discharge_cfs ~ date, data = .)
Residuals:
Min 1Q Median 3Q Max
-129.4 -86.5 -55.4 0.3 5925.8
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.585e+02 5.282e+00 30.007 <2e-16 ***
date 1.393e-03 5.713e-04 2.439 0.0148 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 233.5 on 2258 degrees of freedom
Multiple R-squared: 0.002627, Adjusted R-squared: 0.002186
F-statistic: 5.948 on 1 and 2258 DF, p-value: 0.01481
Regression statistics of August data
aug.model <- neversink_daily.df %>%
filter(month == 8) %>%
lm(discharge_cfs ~ date, data=.)
summary(aug.model)
Call:
lm(formula = discharge_cfs ~ date, data = .)
Residuals:
Min 1Q Median 3Q Max
-91.5 -61.5 -36.9 -2.6 7104.8
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.495e+01 4.794e+00 17.720 < 2e-16 ***
date 1.987e-03 5.152e-04 3.856 0.000118 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 220.2 on 2477 degrees of freedom
Multiple R-squared: 0.005966, Adjusted R-squared: 0.005564
F-statistic: 14.87 on 1 and 2477 DF, p-value: 0.0001184
LS0tCnRpdGxlOiAiRWRkaWUgbW9kdWxlIHN0cmVhbSBkaXNjaGFyZ2UgZnJvbSBoYW5kb3V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgojIFRoaXMgc2NyaXB0IGV4YW1pbmVzIHRoZSBkaXNjaGFyZ2UgaW4gTmV2ZXJzaW5rIENyLiAgICAgIApUaGlzIHNjcmlwdCB1c2VzIHRoZSBVU0dTIGRhdGEgcmV0cmlldmFsIHBhY2thZ2UgdG8gZG93bmxvYWQgZGF0YSBmcm8gTmV2ZXJzaW5rIENyLiBUaGlzIGlzIG1vcmUgdXAgdG8gZGF0ZSB0aGFuIHRoZSBleGNlbCBzaGVldC4KCiMjIEluc3RhbGwgbGlicmFyaWVzLiAgIApUaGVzZSBhcmUgdGhlIGxpYnJhcmllcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzY3JpcHQuIFRoZXNlIGFyZSBpbnN0YWxsZWQgb25seSBvbmNlIGFuZCB0aGVuIGNhbiBiZSBjb21tZW50ZWQgb3V0IHNvIHRoZXkgZG8gbm90IHJ1biBpbiBmdXR1cmUgZXhlY3VhdGlvbnMgb2YgdGhlIHNjcmlwdC4KYGBge3IgaW5zdGFsbCBwYWNrYWdlcywgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUV9CiMgaHR0cHM6Ly9naXRodWIuY29tL1VTR1MtUi9kYXRhUmV0cmlldmFsCgojIGdlbmVyYWwgUiBwYWNrYWdlcyB0byBpbnN0YWxsIGlmIHlvdSBkb250IGhhdmUgdGhlbQojIHJlbW92ZSB0aGUgIiMiIGlmIHlvdSBuZWVkIHRvIHJ1biB0aGUgaW5zdGFsbGF0aW9ucwoKIyBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpICMgZXNzZW50aWFsIGluIGluc3RhbGxpbmcgb3RoZXIgdGhpZ3MKIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSAjIGluc3RhbGxzIGEgbG90IG9mIHRoaW5ncyBhbmQgZ2dwbG90CiMgaW5zdGFsbC5wYWNrYWdlcygic2NhbGVzIikgIyBhbGxvd3MgZ3JlYXQgc2NhbGUgZm9ybWF0dGluZyBvbiBnZ3Bsb3QKIyBpbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKSAjIG1ha2VzIHdvcmtpbmcgd2l0aCBkYXRlcyBlYXNpZXIKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikgIyBjbGVhbiBuYW1lcyBvZiBjb2x1bW5zIGFuZCBvdGhlciB0aGluZ3MKIyBpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKSAjIHJlYWQgaW4gZXhjZWwgZmlsZXMKIyBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKSAjIGludGVyYWN0aXZlIHBsb3RzCiMgaW5zdGFsbC5wYWNrYWdlcygic2tpbXIiKQojIGluc3RhbGwucGFja2FnZXMoInBhdGNod29yayIpICMgbXVsdGlwbGUgcGxvdHMKCiMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUKIyBpbnN0YWxsLnBhY2thZ2VzKCJkYXRhUmV0cmlldmFsIikgIyBVU0dTIERhdGEgUmV0cmVpdmVhbCBNZXRob2QKYGBgCgoKIyMgTG9hZCBMaWJyYXJpZXMgICAgClRoaXMgY29kZSBsb2FkcyB0aGUgbGlicmFyaWVzIGZvciB3b3JraW5nIHdpdGggdGhlIGRhdGEKYGBge3IgbGFvZCBsaWJyYXJpZXMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQojIGxvYWQgdGhlc2UgZXZlcnkgdGltZSAgCmxpYnJhcnkodGlkeXZlcnNlKSAjIHRoZSB0aWR5dmVyc2UgbGlicmFyeSB3aXRoIG1hbnkgc3ViIGxpYnJhcmllcwpsaWJyYXJ5KHNjYWxlcykgIyB3b3JraW5nIHdpdGggZ2dwbG90IHNjYWxlcyAKbGlicmFyeShsdWJyaWRhdGUpICMgd29ya2luZyB3aXRoIGRhdGVzCmxpYnJhcnkoamFuaXRvcikgIyBjbGVhbnMgdXAgZXhjZWwgaW1wb3J0cwpsaWJyYXJ5KHJlYWR4bCkgIyByZWFkIGluIGV4Y2VsIGZpbGVzCmxpYnJhcnkoc2tpbXIpICMgZG9lcyBzdW1tYXJ5IHN0YXRzIGFuZCBvdGhlciB0aGluZ3MKbGlicmFyeShwbG90bHkpICMgbWFrZXMgaW50ZXJhY3RpdmUgcGxvdHMKbGlicmFyeShwYXRjaHdvcmspICMgY29tYmluZXMgbWFueSBwbG90cyB0b2dldGhlcgoKIyAjIGxvYWQgdGhlIFVTR1MgcGFja2FnZQpsaWJyYXJ5KGRhdGFSZXRyaWV2YWwpICMgdXRpbGl0aWVzIGZvciBkb3dubG9hZGluZyBhbmQgd29ya2luZyB3aXRoIFVTR1MgZGF0YQpgYGAKCiMjIFNvdXJjZSBvZiBOZXZlcnNpbmsgZGF0YQpUaGlzIGlzIHRoZSBkYXRhIHRoYXQgaXMgaW4gdGhlIGV4Y2VsIHNoZWV0IHRoYXQgaXMgdXNlZCBpbiB0aGlzIHNjcmlwdC4gICAgICAgIApodHRwczovL3dhdGVyZGF0YS51c2dzLmdvdi9ueS9ud2lzL3V2Lz9zaXRlX25vPTAxNDM1MDAwJlBBUkFtZXRlcl9jZD0wMDA2NSwwMDA2MCw2MzE2MAogClRoaXMgaXMgYWxsIG9mIHRoZSBkYXRhIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB0aGUgc2l0ZS4gICAgICAgICAKaHR0cHM6Ly93YXRlcmRhdGEudXNncy5nb3Yvbndpcy9pbnZlbnRvcnkvP3NpdGVfbm89MDE0MzUwMDAmYWdlbmN5X2NkPVVTR1MKCgojIyBSZWFkIGluIFVTR1MgRGF0YQpUaGlzIGFsbG93cyB5b3UgdG8gcmVhZCBpbiB0aGUgZGFpbHkgbWVhbiBkYXRhIGZvciB0aGUgVVNHUyBzaXRlLiAgICAgIApOb3RlIEVudGVyIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYW5kIHlvdSBjYW4gY2hhbmdlIHRoaXMgdG8gZ2V0IGRpZmZlcmVudCBzaXRlcyBvciB0aW1lIHJhbmdlczogICAgICAgIApzaXRlX25vOiB0aGlzIGlzIHRoZSBzaXRlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0ICAgICAKcGFyX2NvZGU6ICB0aGVzZSBhcmUgdGhlIHBhcmFtdGVyIGNvZGUgbnVtYmVycyAtIDAwMDYwIGlzIGRpc2NoYXJnZSAgICAgCiAgICAgICAgICAgWW91IGNhbiByZXRyZWl2ZSBvdGhlciB2YXJpYWJsZXMgdXNpbmc6ICAgICAKICAgICAgICAgICBjKCIwMDA2MCIsICIwMDA2NSIpICAgIAogICAgICAgICAgIDAwMDEwIHdhdGVyIHRlbXAgICAgCiAgICAgICAgICAgMDAwNjAgZGlzY2hhcmdlICAgICAKICAgICAgICAgICAwMDA2NSBnYWdlIGhlaWdodCAgICAgIAogICAgICAgICAgIDAwMDk1IHNwZWNpZmljIGNvbmR1Y3Rpdml0eSBpZiBhdmFpbGFibGUKICAgICAgICAgICAKc3RhcnQuZGF0ZTogZGF0ZSB0byBzdGFydCBvbiAgICAgIAplbmQuZGF0ZTogICBkYXRlIHRvIGVuZCBvbiAgICAgCgpgYGB7ciByZWFkIGluIGZpbGV9CgojIFRoZSBzaXRlIGlzIE5ldmVyc2luayBhbmQgdGhlIHNpdGUgbnVtYmVyIGlzIDAxNDM1MDAwCiMgVVNHUyAwMTQzNTAwMCBORVZFUlNJTksgUklWRVIgTkVBUiBDTEFSWVZJTExFIE5ZCgojIGVudGVyIHRoZXNlIHZhcmlhYmxlcyBhbmQgdGhleSB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgY29tbWFuZApzaXRlX25vIDwtICAgICAgICAgICIwMTQzNTAwMCIgIyB0aGUgc2l0ZSBudW1iZXIgZnJvbSBVU0dTCnBhcl9jb2RlIDwtICAgICAgICAgIjAwMDYwIiAjIHRoZSBwYXJhbXRlciBjb2RlIHVzZWQgZm9yIGRhdGEgdG8gZG93bmxvYWQKc3RhcnQuZGF0ZSA8LSAgICAgICIxODAwLTAxLTAxIiAjIHN0YXJ0IGRhdGUgLSB0aGlzIGlzIHNldCB0byBkb3dubG9hZCBhbGwgZGF0YSB0aGF0IG1pZ2h0IGJlIHRoZXJlCmVuZC5kYXRlIDwtICAgICAgICAiMjA1MC0wMS0wMSIgIyBlbmQgZGF0ZSAtIG5vdGUgd2lsbCBkb3dubG9hZCB1cCB0byAyMDUwCgojIHN0b3JlcyBkYXRhIGluIG5ldmVyc2lua19kYWlseS5kZiAKIyB0aGVzZSBkbyBub3QgbmVlZCB0byBiZSBjaGFuZ2VzIGFzIHRoZXkgYXJlIGNoYW5nZWQgYWJvdmUKbmV2ZXJzaW5rX2RhaWx5LmRmIDwtIHJlYWROV0lTZHYoc2l0ZU51bWJlcnMgPSBzaXRlX25vLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVVNHUyByZWFkIGRhaWx5IHZhbHVlcyB3aXRoIHRoaXMgc2l0ZSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2QgPSBwYXJfY29kZSwgIyBwYXJhbWV0ZXJzIHRvIGRvd25sb2FkCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHN0YXJ0LmRhdGUsICMgc3RhcnQgZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlID0gZW5kLmRhdGUpICMgZW5kIGRhdGUgCiAgCiMgcmVuYW1lIHRoZSBjb2x1bW5zCm5ldmVyc2lua19kYWlseS5kZiA8LSByZW5hbWVOV0lTQ29sdW1ucyhuZXZlcnNpbmtfZGFpbHkuZGYpICMgcmVuYW1lIHRoZSBjb2x1bW5zIHRvIHdvcmsgYmV0dGVyCmBgYAoKIyBSZW5hbWUgY29sdW1ucwpUaGlzIGp1c3QgcmVuYW1lcyB0aGUgY29sdW1ucyB0byBsb3dlciBjYXNlIGFuZCB2YXJpYWJsZSBuYW1lcyB3aXRoIHVuaXRzICAgCmBgYHtyfQpuZXZlcnNpbmtfZGFpbHkuZGYgPC0gbmV2ZXJzaW5rX2RhaWx5LmRmICU+JSAjIHVzZSB0aGlzIGRhdGFmcmFtZSB0byBtYW5pcHVsYXRlIGl0IGFuZCBzYXZlIHRvIHNhbWUKIyBzZWxlY3Qgc2VsZWN0cyB3aGljaCBkYXRhIHRvIHJldGFpbiBhbmQgY2FuIGFsc28gcmVuYW1lIHZhcmlhYmxlcwogICAgc2VsZWN0KGFnZW5jeV9jZCwgIAogICAgICAgICBzaXRlX25vLCAKICAgICAgICAgZGF0ZSA9IERhdGUsIAogICAgICAgICBkaXNjaGFyZ2VfY2ZzID0gRmxvdykgICMgcmVuYW1lcyBGbG93IGFzIGRpc2NoYXJnZV9jZnMKYGBgCgojIENyZWF0ZSBhIG1vbnRoIHZhcmlhYmxlICAgIApUaGUgbW9kdWxlIHdvdWxkIGxpa2UgdG8gbG9vayBhdCBmbG93cyBkdXJpbmcgZGlmZmVybmV0IG1vbnRocy4gVGhpcyBjcmVhdGVzIGEgbW9udGggY29sdW1uIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGFuZCBwbG90IG9ubHkgdGhlIHJlc3BlY3RpdmUgbW9udGhzLiAgICAKYGBge3J9Cm5ldmVyc2lua19kYWlseS5kZiA8LSBuZXZlcnNpbmtfZGFpbHkuZGYgJT4lCiAgbXV0YXRlKG1vbnRoID0gbW9udGgoZGF0ZSkpICMgY3JlYXRlcyBhIG1vbnRoIGNvbHVtbiB0byB3b3JrIHdpdGgKYGBgCgojIFBsb3QgYWxsIGRpc2NoYXJnZSBkYXRhClRoaXMgaXMgYSBwbG90IG9mIGFsbCBvZiB0aGUgZGF0YSB0aGF0IGlzIG9uIHRoZSBVU0dTIHdlYnNpdGUgZm9yIGRhaWx5IG1lYW4gdmFsdWVzLgpgYGB7cn0KIyBzYXZlcyB0aGUgcGxvdCBhcyBxLnBsb3Qgc28gY2FuIGJlIHVzZWQgbGF0ZXIgb24gICAKcS5wbG90IDwtIG5ldmVyc2lua19kYWlseS5kZiAlPiUgIyB1c2UgdGhpcyBkYXRhZnJhbWUKICBnZ3Bsb3QoYWVzKGRhdGUsIGRpc2NoYXJnZV9jZnMpKSArICMgcGxvdCBkaXNjaGFyZ2VfY2ZzIHZlcnN1cyBkYXRlCiAgZ2VvbV9wb2ludChzaXplPTAuMSkgKyAjIGFkZCBwb2ludHMgdGhhdCBhcmUgc21hbGwKICBnZW9tX2xpbmUoKSAjIGFkZCBhIGxpbmUgb24gdG9wIG9mIHBvaW50cwpxLnBsb3QgIyBjYWxsIHRoZSBwbG90IHRvIGRpc3BsYXkKYGBgCgojIFBsb3QgRmVicnVhcnkgZGF0YSAKVGhpcyBjcmVhdGVzIGEgcGxvdCBvZiBqdXN0IEZlYnJ1YXJ5IGRhdGEuIEl0IGNhbiBkbyB0aGlzIHVzaW5nIHBpcGVzIHJhdGhlciB0aGFuIGNyZWF0aW5nIHN1YmRhdGFmcmFtZXMgd2hpY2ggaXMgYSBrZXkgYWR2YW50YWdlIG9mIHRpZHl2ZXJzZS4gCmBgYHtyfQojIHNhdmVzIGFzIHRoZSBmZWIucGxvdCB1c2luZyB0aGUgbmV2ZXJzaW5rX2RhaWx5LmRmIGRhdGEKZmViLnBsb3QgPC0gbmV2ZXJzaW5rX2RhaWx5LmRmICU+JSAKICBmaWx0ZXIobW9udGggPT0gMikgJT4lICMgdGhpcyBmaWx0ZXJzIG91dCBvbmx5IEZlYnJ1YXJ5CiAgZ2dwbG90KGFlcyhkYXRlLCBkaXNjaGFyZ2VfY2ZzKSkgKyAjIHRoaXMgcGxvdHMgZGlzY2hhcmdlIHZlcnN1cyBkYXRlCiAgZ2VvbV9wb2ludChzaXplID0gMC4xKSArICMgYWRkcyBzbWFsbCBwb2ludHMKICBnZW9tX2xpbmUoKSArICMgYWRkcyBhIGxpbmUKICBsYWJzKHk9Ik1lYW4gTW9udGhseSBEaXNjaGFyZ2UgbV4zL3NlYyIsIHg9IkRhdGUiKSAjIGFkZHMgY2xlYW4gYXhlcyBsYWJlbHMgCmZlYi5wbG90CiAgCmBgYAoKIyBJbnRlcmFjdGl2ZSBwbG90IG9mIGZlYiBkYXRhClRoaXMgaXMgYW4gaW50ZXJhY3RpdmUgcGxvdCBvZiB0aGUgZmVicnVhcnkgZGF0YS4gWW91IGNhbiB6b29tIGluIGFuZCBvdXQgYW5kIHNlbGVjdCBwYXJ0aWN1bGFyIHBpbnRzIHRvIHNlZSB0aGUgdmFsdWVzLiAgICAgCmBgYHtyfQpnZ3Bsb3RseShmZWIucGxvdCkKYGBgCgoKIyBBdWd1c3QgZGF0YQpQbG90IG9mIEF1Z3VzdCBkYXRhIG9ubHkgdXNpbmcgZWggYWJvdmUgZm9ybWF0ZS4gVGhlIG9ubHkgdGhpbmcgdG8gY2hhbmdlIGlzIHRoZSB2YWx1ZSBmb3IgdGhlIG1vbnRoIHZhcmlhYmxlLiBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGJ5IHNob3dpbmcgdGhlIG1vbnRobHkgbWVhbiBvZiBkYXRhIGluIHRoZSBzYW1lIGZvcm1hdCBiZWxvdyBhZGRpbmcgYSBhIHN0YXRfc3VtbWFyeSBjb21tYW5kIHRvIHNob3cgbW9udGhseSBtZWFuIGFzIHdlbGwuCmBgYHtyfQphdWcucGxvdCA8LSBuZXZlcnNpbmtfZGFpbHkuZGYgJT4lCiAgZmlsdGVyKG1vbnRoID09IDgpICU+JQogIGdncGxvdChhZXMoZGF0ZSwgZGlzY2hhcmdlX2NmcykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHk9Ik1lYW4gTW9udGhseSBEaXNjaGFyZ2UgbV4zL3NlYyIsIHg9IkRhdGUiKQphdWcucGxvdApgYGAKCiMgQ29tcGFyZSB0aGUgRmVicnVhcnkgYW5kIEF1Z3VzdCBwbG90cwpXZSBjYW4gdXNlIHBhdGNod29yayB0byBwdXQgYm90aCBwbG90cyBvbiB0aGUgc2FtZSBwYWdlIHRvIGNvbXBhcmUgdGhlbQpgYGB7cn0KZmViX2F1Zy5wbG90IDwtIGZlYi5wbG90ICsKICAgICAgICAgICAgICAgIGF1Zy5wbG90ICsKICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAyKQpmZWJfYXVnLnBsb3QKYGBgCgojIEFkZCB0cmVuZCBsaW5lcyBvZiBkaXNjaGFyZ2Ugb3ZlciB0aW1lCkJlY2F1c2UgdGhlIGRhdGEgaXMgb3ZlciBzdWNoIGEgd2lkZSByYW5nZSBJIGhhdmUgem9vbWVkIGluLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gem9vbSAtIHRoZSBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDMwMCkpIHdpbGwgZGVsZXRlIGRhdGEgdGhhdCBpcyBub3QgaW4gdGhpcyByYW5nZS4gVGhlIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwzMDApKSB3aWxsIHpvb20gaW4gd2l0aG91dCBkZWxldGluZyBkYXRhLgpgYGB7cn0KZmViX2F1Zy5wbG90IDwtIGZlYi5wbG90ICsgIyBjYWxsIHRoZSBmZWIgcGxvdAogICAgICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgIyBhZGQgYSBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDMwMCkpICsgIyB6b29tIGludG8gMCAtIDMwMCAKICAgICAgICAgICAgICAgIGF1Zy5wbG90ICsgCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAjIGFkZCBhIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDMwMCkpICsgIyB6b29tIGludG8gMCAtIDMwMCAKICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAyKSAjIG1ha2UgdGhlIHBsb3QgbGF5b3V0IDIgY29sdW1ucwpmZWJfYXVnLnBsb3QKYGBgCgojIFJlZ3Jlc3Npb24gc3RhdGlzdGljcyBvZiBGZWJydWFyeSBkYXRhCmBgYHtyfQpmZWIubW9kZWwgPC0gbmV2ZXJzaW5rX2RhaWx5LmRmICU+JSAKICBmaWx0ZXIobW9udGggPT0gMikgJT4lCiAgbG0oZGlzY2hhcmdlX2NmcyB+IGRhdGUsIGRhdGE9LikKc3VtbWFyeShmZWIubW9kZWwpCgpgYGAKCiMgUmVncmVzc2lvbiBzdGF0aXN0aWNzIG9mIEF1Z3VzdCBkYXRhCmBgYHtyfQphdWcubW9kZWwgPC0gbmV2ZXJzaW5rX2RhaWx5LmRmICU+JSAKICBmaWx0ZXIobW9udGggPT0gOCkgJT4lCiAgbG0oZGlzY2hhcmdlX2NmcyB+IGRhdGUsIGRhdGE9LikKc3VtbWFyeShhdWcubW9kZWwpCgpgYGAKCgo=